/*这个定时器主要是确定交流电的零点时间定时*/

#include "bsp_C_phase_zero_point_tim.h"
#include "bsp_C_phase_tim.h"
#include "bsp_gpio_output.h"
#include "bsp_duty_TIM.h"
#include "bsp_exti.h"

/**
  * @brief  定时器17中断优先级配置
  * @param  无
  * @retval 无
  */
static void C_PHASE_Zero_Point_TIM_NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  // 设置中断来源
  NVIC_InitStructure.NVIC_IRQChannel = C_PHASE_ZERO_POINT_TIM_IRQn;
  // 设置抢占优先级
  NVIC_InitStructure.NVIC_IRQChannelPriority = 5;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

/**
  * @brief  定时器17模式配置
  * @param  无
  * @retval 无
  */
static void C_PHASE_Zero_Point_TIM_Mode_Config(void)
{
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

  //开启定时器17时钟
  RCC_APB2PeriphClockCmd(C_PHASE_ZERO_POINT_TIM_CLK, ENABLE);
  TIM_TimeBaseStructure.TIM_Period = C_PHASE_RISING_EDGE_TO_ZERO_POINT - 1; //这里的设置值无效(实际会用TIM_SetCounter()函数进行设置)
  TIM_TimeBaseStructure.TIM_Prescaler = 48 - 1;
  //定时器分频因子，配置死区时间时需要用到
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  //计数器计数模式，设置为向上计数
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  //重复计数器的值,没有用到不用管
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  TIM_TimeBaseInit(C_PHASE_ZERO_POINT_TIM, &TIM_TimeBaseStructure);

  // 清除定时器更新中断标志位
  TIM_ClearFlag(C_PHASE_ZERO_POINT_TIM, TIM_FLAG_Update);

  // 开启定时器更新中断
  TIM_ITConfig(C_PHASE_ZERO_POINT_TIM, TIM_IT_Update, ENABLE);

  // 使能定时器   定时器的开启交给外部中断函数来处理
  TIM_Cmd(C_PHASE_ZERO_POINT_TIM, DISABLE);
}

/**
  * @brief  定时器2配置
  * @param  无
  * @retval 无
  */
void C_Phase_Zero_Point_Tim_Config(void)
{
  C_PHASE_Zero_Point_TIM_Mode_Config();
  C_PHASE_Zero_Point_TIM_NVIC_Configuration();
}

void C_PHASE_ZERO_POINT_TIM_IRQHandler(void)
{ //进入到这里说明零点到了
  if (TIM_GetITStatus(C_PHASE_ZERO_POINT_TIM, TIM_IT_Update) != RESET)
  {
    TIM_ClearITPendingBit(C_PHASE_ZERO_POINT_TIM, TIM_IT_Update);
    TIM_Cmd(C_PHASE_ZERO_POINT_TIM, DISABLE);

    //零点定时器中断中只使能A相定时器
    PHASE_C_TIM->ARR = Turn_On_Time; //这个Turn_On_Time值会随PA8脚的PWM占空比变化而变化
    PHASE_C_TIM->CNT = 0;
    TIM_Cmd(PHASE_C_TIM, ENABLE);
    C_PHASE_INDICATOR_TOGGLE;
  }
}